package qualomelhor.gwt.modules.client;

import java.util.ArrayList;

import qualomelhor.database.Avatar;
import qualomelhor.database.BuscaComparacao;
import qualomelhor.database.Comparacao;
import qualomelhor.database.LinkComparacao;
import qualomelhor.database.Comparacao.TipoComparacao;
import qualomelhor.database.PathComparacao;
import qualomelhor.database.Produto;
import qualomelhor.database.ParametrosSistema.SiteHost;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;

public class EditarComparacao implements EntryPoint {
	private Label lbId;
	private ListBox cbTipoComparacao;
    private ListBox cbIdProduto1;
    private ListBox cbIdProduto2;
    private ListBox cbIdProduto3;
    private VerticalPanel vertPListPath;
    private VerticalPanel vertPListLink;
    private VerticalPanel vertPBuscaComp;
    private VerticalPanel vertPSharesFB;
    private TextBox[] txtPathComparacao;
    private ListBox[] cbSite;
    private TextBox[] txtComplementoPergunta;
    private ListBox cbSiteOriginal;
    private TextBox txtLocale;
    private Label lbImgVersus;
    private Label[] matrLbShareFB;
    private Label lbIdUsuario;
	private int posReg = 0;
	private ArrayList<Produto> listProdutos;
	private ArrayList<Comparacao> listComparacao;
	private ISessionSuportServiceAsync serviceSupportSvc = GWT.create(ISessionSuportService.class);
	private Label lbNumRegistro;
	private Avatar avatar;

	public static native void showDivBloqueio()  /*-{
		//$wnd.alert("teste = " + $doc.getElementById("divBloqueio").style.display);
		$doc.getElementById("divBloqueio").style.display="block";
		$doc.getElementById("divBloqueioSolido").style.display="block";
	}-*/;

	public static native void hideDivBloqueio()  /*-{
		//$wnd.alert("teste = " + $doc.getElementById("divBloqueio").style.display);
		$doc.getElementById("divBloqueio").style.display="none";
		$doc.getElementById("divBloqueioSolido").style.display="none";
	}-*/;

	@Override
	public void onModuleLoad() {
		carregaListProdutos();
	}

	public void carregaListProdutos() {
		carregaProdutos(true);
	}

	public void carregaListaComparacao() {
		carregaComparacao(true);
	}

	private void carregaFormAddPathComparacao(final Long idComparacao, String pathExemplo, String complementoExemplo) {

		showDivBloqueio();

		final RootPanel rootPanel = RootPanel.get("divPopupCentro");

		rootPanel.clear();
		VerticalPanel vertP = new VerticalPanel();
		vertP.setStylePrimaryName("divCemPorCento");
		vertP.addStyleName("divCenter");
    	rootPanel.add(vertP);

    	HorizontalPanel horP1 = new HorizontalPanel();
		vertP.add(horP1);
		vertP.setCellVerticalAlignment(horP1, HasVerticalAlignment.ALIGN_MIDDLE);

		final TextBox txtPath = new TextBox();
		horP1.add(new Label("Path:"));
    	horP1.add(txtPath);
    	txtPath.setText(pathExemplo);

    	HorizontalPanel horP2 = new HorizontalPanel();
		vertP.add(horP2);
		vertP.setCellVerticalAlignment(horP2, HasVerticalAlignment.ALIGN_MIDDLE);

    	final ListBox cbSiteComp = new ListBox();
    	horP2.add(new Label("Site:"));
    	horP2.add(cbSiteComp);
    	for (int j = 0; j < SiteHost.values().length; j++) {
    		boolean encontrado = false;
    		for (int z = 0; z < listComparacao.get(posReg).getListPathComparacao().size(); z++) {
    			if (SiteHost.values()[j].equals(listComparacao.get(posReg).getListPathComparacao().get(z).getSite())) {
    				encontrado = true;
    				break;
    			}
    		}
			if (!encontrado) {
				cbSiteComp.addItem(SiteHost.values()[j].getPergunta(), String.valueOf(SiteHost.values()[j].getIdSite()));
			}
    	}

    	HorizontalPanel horP2_5 = new HorizontalPanel();
		vertP.add(horP2_5);
		vertP.setCellVerticalAlignment(horP2_5, HasVerticalAlignment.ALIGN_MIDDLE);

		final TextBox txtComplemento = new TextBox();
		horP2_5.add(new Label("Complemento:"));
		horP2_5.add(txtComplemento);

    	HorizontalPanel horP3 = new HorizontalPanel();
		vertP.add(horP3);
		vertP.setCellVerticalAlignment(horP3, HasVerticalAlignment.ALIGN_MIDDLE);
    	
    	Button btnGravar = new Button("Gravar");
    	horP3.add(btnGravar);
    	btnGravar.setStylePrimaryName("btnGravar");

    	btnGravar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				Window.alert("vai gravar..." + cbSiteComp.getSelectedIndex());
				SiteHost site = SiteHost.getSiteHostPerId(Integer.parseInt(cbSiteComp.getValue(cbSiteComp.getSelectedIndex())));
				if (site != null) {
					System.out.println("vai gravar path .. idcomp:[" + idComparacao + "], site:[" + site.getHost() + "], complemento:[" + txtComplemento.getText() + "]");
					addPathComparacao(idComparacao, txtPath.getText(), site, txtComplemento.getText());
				} else {
					Window.alert("site nulo: " + Integer.parseInt(cbSiteComp.getValue(cbSiteComp.getSelectedIndex())));
				}
			}
		});
    	
    	Button btnCancel = new Button ("Cancel");
    	horP3.add(btnCancel);
    	btnCancel.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				hideDivBloqueio();
				rootPanel.clear();
			}
		});

	}
	
	private void carregaFormEditarComparacao() {
		System.out.println("listProdutos.size = " + listProdutos.size());
		System.out.println("listComparacao.size = " + listComparacao.size());
		RootPanel rootPanel = RootPanel.get("divCadastro");
		rootPanel.clear();
		//rootPanel.getElement().getStyle().setPosition(Position.RELATIVE);

		ScrollPanel scroll = new ScrollPanel();
		rootPanel.add(scroll);
		scroll.setHeight("100%");

		VerticalPanel verticalPanel = new VerticalPanel();
		scroll.add(verticalPanel);
		//verticalPanel.setSize("278px", "280px");

		HorizontalPanel horizontalPanelNav = new HorizontalPanel();
		verticalPanel.add(horizontalPanelNav);

		Button btnNovaCategoria = new Button("Novo");
		btnNovaCategoria.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				novo();
			}
		});
		horizontalPanelNav.add(btnNovaCategoria);

		Button btnAnterior = new Button("Anterior");
		btnAnterior.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg >= 0) {
					posReg--;
				}
				atualiza();
			}
		});
		horizontalPanelNav.add(btnAnterior);

		Button btnProximo = new Button("Proximo");
		btnProximo.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg < listComparacao.size()) {
					posReg++;
				}
				atualiza();
			}
		});
		horizontalPanelNav.add(btnProximo);

		Button btnDeletar = new Button("Deletar");
		btnDeletar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				deletaComparacao(listComparacao.get(posReg).getId());
			}
		});
		horizontalPanelNav.add(btnDeletar);

		lbNumRegistro = new Label("");
		horizontalPanelNav.add(lbNumRegistro);

		FlexTable tbCadastro = new FlexTable();
		verticalPanel.add(tbCadastro);

		Label lblNewLabel = new Label("Id:");
		tbCadastro.setWidget(0, 0, lblNewLabel);

		lbId = new Label("");
		tbCadastro.setWidget(0, 1, lbId);
		
		Label lbTipo = new Label("Tipo Comparacao:");
		tbCadastro.setWidget(1, 0, lbTipo);
		
		cbTipoComparacao = new ListBox();
		for (int i = 0; i < TipoComparacao.values().length; i++) {
			cbTipoComparacao.addItem(TipoComparacao.values()[i].getDescricao(), String.valueOf(TipoComparacao.values()[i].getIdTipoComparacao()));
		}
		tbCadastro.setWidget(1, 1, cbTipoComparacao);

		Label lblNewLabel_prod1 = new Label("Id Produto1:");
		lblNewLabel_prod1.setSize("138", "16");
		Label lblNewLabel_prod2 = new Label("Id Produto2:");
		lblNewLabel_prod2.setSize("138", "16");
		Label lblNewLabel_prod3 = new Label("Id Produto3:");
		lblNewLabel_prod3.setSize("138", "16");

		cbIdProduto1 = new ListBox();
		cbIdProduto2 = new ListBox();
		cbIdProduto3 = new ListBox();
		for (int i = 0; i < listProdutos.size(); i++) {
			cbIdProduto1.addItem(listProdutos.get(i).getNomeProduto(), listProdutos.get(i).getId().toString());
			cbIdProduto2.addItem(listProdutos.get(i).getNomeProduto(), listProdutos.get(i).getId().toString());
			cbIdProduto3.addItem(listProdutos.get(i).getNomeProduto(), listProdutos.get(i).getId().toString());
		}

		tbCadastro.setWidget(2, 0, lblNewLabel_prod1);
		tbCadastro.setWidget(3, 0, lblNewLabel_prod2);
		tbCadastro.setWidget(4, 0, lblNewLabel_prod3);

		tbCadastro.setWidget(2, 1, cbIdProduto1);
		cbIdProduto1.setWidth("152px");
		tbCadastro.setWidget(3, 1, cbIdProduto2);
		cbIdProduto2.setWidth("152px");
		tbCadastro.setWidget(4, 1, cbIdProduto3);
		cbIdProduto3.setWidth("152px");

		Label lblEnderecofoto = new Label("List Path:");
		tbCadastro.setWidget(5, 0, lblEnderecofoto);

		//txtEnderecoFoto = new TextBox();
		vertPListPath = new VerticalPanel();
		tbCadastro.setWidget(5, 1, vertPListPath);

		Label lbPerg = new Label("Pergunta Original:");
		tbCadastro.setWidget(6, 0, lbPerg);

		cbSiteOriginal = new ListBox();
		for (SiteHost s: SiteHost.values()) {
			cbSiteOriginal.addItem(s.getIdSite() + " - " + s.getPergunta(), String.valueOf(s.getIdSite()));
		}
		tbCadastro.setWidget(6, 1, cbSiteOriginal);
		
		Label lbLocale = new Label("Locale:");
		tbCadastro.setWidget(7, 0, lbLocale);

		txtLocale = new TextBox();
		tbCadastro.setWidget(7, 1, txtLocale);

		Label lbVersus = new Label("ImgVersus:");
		tbCadastro.setWidget(8, 0, lbVersus);

		lbImgVersus = new Label("");
		tbCadastro.setWidget(8, 1, lbImgVersus);

		Label lblabel = new Label("idUsuario:");
		tbCadastro.setWidget(9, 0, lblabel);
		lblabel.setSize("138", "16");

		lbIdUsuario = new Label("");
		tbCadastro.setWidget(9, 1, lbIdUsuario);

		HorizontalPanel horizontalPanel_8 = new HorizontalPanel();
		verticalPanel.add(horizontalPanel_8);
		verticalPanel.setCellHorizontalAlignment(horizontalPanel_8, HasHorizontalAlignment.ALIGN_CENTER);

		Label lblabelLinks = new Label("List_Link:");
		tbCadastro.setWidget(10, 0, lblabelLinks);

		vertPListLink = new VerticalPanel();
		tbCadastro.setWidget(10, 1, vertPListLink);

		Label lblabelBusca = new Label("Busca Comp:");
		tbCadastro.setWidget(11, 0, lblabelBusca);

		vertPBuscaComp = new VerticalPanel();
		tbCadastro.setWidget(11,  1, vertPBuscaComp);

		Label lblabelShare = new Label("Share FB List:");
		tbCadastro.setWidget(12, 0, lblabelShare);

		vertPSharesFB = new VerticalPanel();
		tbCadastro.setWidget(12, 1, vertPSharesFB);

		Button btnSalvar = new Button("Salvar");
		btnSalvar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				Long id = lbId.getText().equals("")?null:Long.valueOf(lbId.getText());
				Long idProduto1 = (cbIdProduto1.getSelectedIndex() == -1)?null:Long.valueOf(cbIdProduto1.getValue(cbIdProduto1.getSelectedIndex()));
				Long idProduto2 = (cbIdProduto2.getSelectedIndex() == -1)?null:Long.valueOf(cbIdProduto2.getValue(cbIdProduto2.getSelectedIndex()));
				Long idProduto3 = (cbIdProduto3.getSelectedIndex() == -1)?null:Long.valueOf(cbIdProduto3.getValue(cbIdProduto3.getSelectedIndex()));
				ArrayList<PathComparacao> listPathComparacao = new ArrayList<PathComparacao>(0);
				for (int i = 0; i < txtPathComparacao.length; i++) {
					if (!txtPathComparacao[i].getText().trim().equals("")) {
						listPathComparacao.add(new PathComparacao(txtPathComparacao[i].getText().trim(), SiteHost.getSiteHostPerId(Integer.parseInt(cbSite[i].getValue((cbSite[i].getSelectedIndex())))), txtComplementoPergunta[i].getText().trim()));
					}
				}

				salvaComparacao(id, TipoComparacao.getComparacaoPorId(Integer.parseInt(cbTipoComparacao.getValue(cbTipoComparacao.getSelectedIndex()))), idProduto1, idProduto2, idProduto3, listPathComparacao, SiteHost.getSiteHostPerId(Integer.parseInt(cbSiteOriginal.getValue(cbSiteOriginal.getSelectedIndex()))), txtLocale.getText(), avatar);
			}
		});
		horizontalPanel_8.add(btnSalvar);
		horizontalPanel_8.setCellHorizontalAlignment(btnSalvar, HasHorizontalAlignment.ALIGN_CENTER);
		
		if (listComparacao.size() > 0) {
			posReg = 0;
			atualiza();
		}
	}

	private void novo() {
		lbNumRegistro.setText("Novo Registro");
		lbId.setText("");
		cbTipoComparacao.setSelectedIndex(-1);
	    cbIdProduto1.setSelectedIndex(-1);
	    cbIdProduto2.setSelectedIndex(-1);
	    cbIdProduto3.setSelectedIndex(-1);
	    vertPListPath.clear();
	    vertPListLink.clear();
	    vertPBuscaComp.clear();
	    vertPSharesFB.clear();
	    
	    HorizontalPanel horP = new HorizontalPanel();
	    vertPListPath.add(horP);
	    
	    txtPathComparacao = new TextBox[1];
	    txtPathComparacao[0] = new TextBox();
	    horP.add(txtPathComparacao[0]);
	    //txtPathComparacao[0].setText("");
	    cbSite = new ListBox[1];
	    cbSite[0] = new ListBox();
    	for (int j = 0; j < SiteHost.values().length; j++) {
    		cbSite[0].addItem(SiteHost.values()[j].getPergunta(), String.valueOf(SiteHost.values()[j].getIdSite()));
    	}
    	cbSite[0].setSelectedIndex(-1);
    	horP.add(cbSite[0]);

        txtComplementoPergunta = new TextBox[1];
        txtComplementoPergunta[0] = new TextBox();
        horP.add(txtComplementoPergunta[0]);

	    cbSiteOriginal.setSelectedIndex(-1);
	    txtLocale.setText("");
	    lbImgVersus.setText("");
	    matrLbShareFB = new Label[1];
	    lbIdUsuario.setText("");
	}

	private void atualiza() {
		if (posReg <= -1 || posReg >= listComparacao.size()) {
			novo();
		} else {
			lbNumRegistro.setText("Registro " + (posReg + 1) + " de " + listComparacao.size());
			lbId.setText(listComparacao.get(posReg).getId().toString());

			for (int i = 0; i < cbTipoComparacao.getItemCount(); i++) {
				if (Byte.valueOf(cbTipoComparacao.getValue(i)).equals(listComparacao.get(posReg).getTipoComparacao().getIdTipoComparacao())) {
					cbTipoComparacao.setSelectedIndex(i);
					break;
				}
			}

			if (listComparacao.get(posReg).getListProdutosComp().size() >= 1 && listComparacao.get(posReg).getListProdutosComp().get(0) != null) {
				for (int i = 0; i < cbIdProduto1.getItemCount(); i++) {
					if (cbIdProduto1.getValue(i).equals(listComparacao.get(posReg).getListProdutosComp().get(0).toString())) {
						cbIdProduto1.setSelectedIndex(i);
						break;
					}
				}
			}
			if (listComparacao.get(posReg).getListProdutosComp().size() >= 2 && listComparacao.get(posReg).getListProdutosComp().get(1) != null) {
				for (int i = 0; i < cbIdProduto2.getItemCount(); i++) {
					if (cbIdProduto2.getValue(i).equals(listComparacao.get(posReg).getListProdutosComp().get(1).toString())) {
						cbIdProduto2.setSelectedIndex(i);
						break;
					}
				}
			}
			if (listComparacao.get(posReg).getListProdutosComp().size() >= 3 && listComparacao.get(posReg).getListProdutosComp().get(2) != null) {
				for (int i = 0; i < cbIdProduto3.getItemCount(); i++) {
					if (cbIdProduto3.getValue(i).equals(listComparacao.get(posReg).getListProdutosComp().get(2).toString())) {
						cbIdProduto3.setSelectedIndex(i);
						break;
					}
				}
			} else {
				cbIdProduto3.setSelectedIndex(-1);
			}

		    txtPathComparacao = new TextBox[listComparacao.get(posReg).getListPathComparacao().size()];
		    cbSite = new ListBox[listComparacao.get(posReg).getListPathComparacao().size()];
		    txtComplementoPergunta = new TextBox[listComparacao.get(posReg).getListPathComparacao().size()];

		    vertPListPath.clear();
		    for (int i = 0; i < listComparacao.get(posReg).getListPathComparacao().size(); i++) {
		    	txtPathComparacao[i] = new TextBox();
		    	txtPathComparacao[i].setText(listComparacao.get(posReg).getListPathComparacao().get(i).getPath());
		    	cbSite[i] = new ListBox();
		    	for (int j = 0; j < SiteHost.values().length; j++) {
		    		cbSite[i].addItem(SiteHost.values()[j].getPergunta(), String.valueOf(SiteHost.values()[j].getIdSite()));
		    		System.out.println("getIdSite() = " + listComparacao.get(posReg).getListPathComparacao().get(i).getSite().getIdSite());
		    		if (cbSite[i].getValue(j).equals(String.valueOf(listComparacao.get(posReg).getListPathComparacao().get(i).getSite().getIdSite()))) {
		    			cbSite[i].setSelectedIndex(j);
		    		}
		    	}
		    	txtComplementoPergunta[i] = new TextBox();
		    	txtComplementoPergunta[i].setText(listComparacao.get(posReg).getListPathComparacao().get(i).getComplementoPergunta());

		    	HorizontalPanel horP = new HorizontalPanel();
		    	horP.add(txtPathComparacao[i]);
		    	horP.add(cbSite[i]);
		    	horP.add(txtComplementoPergunta[i]);
		    	Button btnDeletePath = new Button("Del");
		    	btnDeletePath.setStylePrimaryName("btnDeleteMini");
		    	btnDeletePath.setTitle("idComp:[" + listComparacao.get(posReg).getId() + "], Site:[" + listComparacao.get(posReg).getListPathComparacao().get(i).getSite().getIdSite() + "]!");
		    	btnDeletePath.addClickHandler(new ClickHandler() {
					@Override
					public void onClick(ClickEvent event) {
						Button b = (Button)event.getSource();
						Long idComp = Long.parseLong(b.getTitle().substring(8, b.getTitle().indexOf("], Site:")));
						SiteHost site = SiteHost.getSiteHostPerId(Integer.parseInt(b.getTitle().substring(b.getTitle().indexOf("Site:[") + 6, b.getTitle().indexOf("]!"))));
						System.out.println("vai deletar path .. idcomp:[" + idComp + "], site:[" + site.getHost() + "]");
						deletaPathComparacao(idComp, site);
					}
				});
		    	
		    	if (listComparacao.get(posReg).getListPathComparacao().size() > 1) {
		    		horP.add(btnDeletePath);
		    	}
		    	vertPListPath.add(horP);
		    }
		    Button btnAddPath = new Button("nova Path");
		    btnAddPath.setStylePrimaryName("btnAddPath");
		    vertPListPath.add(btnAddPath);
		    btnAddPath.addClickHandler(new ClickHandler() {
				@Override
				public void onClick(ClickEvent event) {
					carregaFormAddPathComparacao(listComparacao.get(posReg).getId(), listComparacao.get(posReg).getListPathComparacao().get(0).getPath(), listComparacao.get(posReg).getListPathComparacao().get(0).getComplementoPergunta());
				}
			});

		    for (int i = 0; i < cbSiteOriginal.getItemCount(); i++) {
		    	if (Byte.parseByte(cbSiteOriginal.getValue(i)) == listComparacao.get(posReg).getSiteOriginal().getIdSite()) {
		    		cbSiteOriginal.setSelectedIndex(i);
		    		break;
		    	}
		    }

		    if (listComparacao.get(posReg).getLocale() != null) {
		    	txtLocale.setText(listComparacao.get(posReg).getLocale());
		    } else {
		    	txtLocale.setText("");
		    }

		    if (listComparacao.get(posReg).getLocale() != null) {
		    	lbImgVersus.setText(listComparacao.get(posReg).getLinkImageVersus());
		    } else {
		    	lbImgVersus.setText("");
		    }

		    vertPListLink.clear();
		    carregaLinksComparacao(listComparacao.get(posReg).getId());

		    vertPBuscaComp.clear();
		    carregaListaBuscaComparacaoPorIdComparacao(listComparacao.get(posReg).getId());

		    vertPSharesFB.clear();
		    if (listComparacao.get(posReg).getListSharesID_FB() == null) {
		    	listComparacao.get(posReg).setListSharesFB_Id(new ArrayList<String>(0));
		    }
		    matrLbShareFB = new Label[listComparacao.get(posReg).getListSharesID_FB().size()];
		    for (int p = 0; p < listComparacao.get(posReg).getListSharesID_FB().size(); p++) {
		    	matrLbShareFB[p] = new Label(listComparacao.get(posReg).getListSharesID_FB().get(p));
		    	vertPSharesFB.add(matrLbShareFB[p]);
		    }

		    lbIdUsuario.setText(listComparacao.get(posReg).getIdUsuario().toString());
		    avatar = listComparacao.get(posReg).getAvatar();
		}
	}

	private void salvaComparacao(Long id, TipoComparacao tipoComparacao, Long idProduto1, Long idProduto2, Long idProduto3, ArrayList<PathComparacao> listPath, SiteHost site, String locale, Avatar av) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<Comparacao> callback = new AsyncCallback<Comparacao>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Comparacao comp) {
				if (comp == null) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				} else {
					listComparacao.set(posReg, comp);
					atualiza();
					Window.alert("Salvo");
				}
			}
		};

		ArrayList<Long> listComp = new ArrayList<Long>(0);
		if (idProduto1 != null) {
			listComp.add(idProduto1);
			System.out.println("Adicionou o produto 1..");
		}
		if (idProduto2 != null) {
			listComp.add(idProduto2);
			System.out.println("Adicionou o produto 2..");
		}
		if (idProduto3 != null) {
			listComp.add(idProduto3);
			System.out.println("Adicionou o produto 3..");
		}
		serviceSupportSvc.gravaComparacao(id, tipoComparacao, listComp, listPath, site, locale, av, callback);
	}

	private void deletaComparacao(Long id) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				}
				carregaProdutos(true);
			}
		};
		System.out.println("Deletando comparacao.." + id);
		serviceSupportSvc.deletaComparacao(id, callback);
	}

	private void addPathComparacao(Long idComparacao, String path, SiteHost site, String complementoPergunta) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Comparacao> callback = new AsyncCallback<Comparacao>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Comparacao comp) {
				if (comp == null) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				} else {
					listComparacao.set(posReg, comp);
					atualiza();
					Window.alert("Salvo!");
					hideDivBloqueio();
				}
			}
		};
		System.out.println("adicionando path comparacao..");
		serviceSupportSvc.addPathComparacao(idComparacao, path, site, complementoPergunta, callback);		
	}

	private void deletaPathComparacao(Long idComp, SiteHost site) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				} else {
					carregaProdutos(true);
				}
			}
		};
		System.out.println("Deletando path comparacao..");
		serviceSupportSvc.deletaPathComparacao(idComp, site, callback);
	}

	void carregaProdutos (boolean recarregar) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<Produto>> callback = new AsyncCallback<ArrayList<Produto>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<Produto> result) {
				listProdutos = result;
				carregaListaComparacao();
			}
		}; 

		serviceSupportSvc.getListProdutos(recarregar, callback);
	}

	void carregaComparacao (boolean recarregar) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<Comparacao>> callback = new AsyncCallback<ArrayList<Comparacao>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<Comparacao> result) {
				listComparacao = result;
				carregaFormEditarComparacao();
			}
		};

		serviceSupportSvc.getListComparacao(recarregar, callback);
	}

	void carregaListaBuscaComparacaoPorIdComparacao (Long idComparacao) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {

			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<BuscaComparacao>> callback = new AsyncCallback<ArrayList<BuscaComparacao>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<BuscaComparacao> result) {
				System.out.println("BuscaComparacoes retornadas: " + result.size());
				for (BuscaComparacao buscaComp: result) {
					vertPBuscaComp.add(new Label("prod:[" + buscaComp.getIdProduto() + "] - comparacao:[" + buscaComp.getIdComparacao() + "]"));
				}
				System.out.println("lista de buscas carregados...");
			}
		}; 

		System.out.println("carregando lista de Busca da comparacao...");
		serviceSupportSvc.carregaListaBuscaComparacaoPorIdComparacao(idComparacao, callback);
	}

	void carregaLinksComparacao (Long idComparacao) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {

			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<LinkComparacao>> callback = new AsyncCallback<ArrayList<LinkComparacao>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<LinkComparacao> result) {
				for (LinkComparacao linkComp: result) {
					vertPListLink.add(new Label("[" + linkComp.getLink() + "] - [" + linkComp.getSite().getHost() + "]"));
				}
				System.out.println("lista de links carregados...");
			}
		}; 

		System.out.println("carregando lista de links da comparacao...");
		serviceSupportSvc.carregaListLinkComparacao(idComparacao, callback);
	}
}